#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <vector>
#include <chrono>
#include <queue>

// // 多线程交替打印偶数
// std::mutex _mutex;
// std::condition_variable cv;
// int turn = 1;

// // 打印奇数
// void printEven(int range) {
//     for(int i = 1; i < range; i += 2) {
//         // turn为1时打印奇数
//         std::unique_lock<std::mutex> lock(_mutex);
//         while(turn != 1) cv.wait(lock);
//         std::cout << "Evan: " << i << std::endl;
//         turn = 0;
//         cv.notify_all();
//     }
// }

// // 打印偶数
// void printOdd(int range) {
//     for(int i = 2; i < range; i += 2) {
//         // turn为0时打印偶数
//         std::unique_lock<std::mutex> lock(_mutex);
//         while(turn != 0) cv.wait(lock);
//         std::cout << "Odd: " << i << std::endl;
//         turn = 1;
//         cv.notify_all();
//     }
// }


// int main() {
//     std::thread t1(printEven, 100);
//     std::thread t2(printOdd, 100);

//     t1.join();
//     t2.join();
//     return 0;
// }

std::mutex mtx;
std::condition_variable cv;
std::queue<int> dataQueue;


void producer(){
    for(int i = 0; i < 10; i++) {
        std::this_thread::sleep_for(std::chrono::microseconds(100));
        std::lock_guard<std::mutex> lock(mtx);
        dataQueue.push(i);
        std::cout << "Produced: " << i << std::endl; 
        cv.notify_one();
    }
}

void consumer() {
    while(1) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [](){
            return !dataQueue.empty();
        });
        int data = dataQueue.front();
        dataQueue.pop();
        std::cout << "Consumed: " << data << std::endl;
        if(data == 9) break;
    }
}


int main() {
    std::thread producerThread(producer);
    std::thread consumerThread(consumer);
    


    producerThread.join();
    consumerThread.join();


    return 0;
}


